package com.candy.dao;

import java.sql.*;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Set;

/**
 * JDBC的封装
 */
public class DBDriver {
    /**
     * 获取数据库的链接对象
     * @return 数据库链接对象
     */
    public static Connection getConn(){
        Connection conn=null;
        try{
            //         （1）注册或实例化jdbc的驱动类
            Class.forName("com.mysql.cj.jdbc.Driver");
//        （2）获取数据库连接对象Connection
//            jdbc:mysql表示使用jdbc链接mysql数据库
//            localhost：表示要链接的数据库所在的地址，此时的localhost表示本机，与127.0.0.1相同
//            database_name表示要链接的数据库的名字
            String url="jdbc:mysql://localhost:3306/ld_mysql0317? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true";
            String username="root";
            String password="123456";
            conn=DriverManager.getConnection(url,username,password);
        }catch (Exception e){

        }
            return conn;
    }

    /**
     * 查询操作
     * @param sql 要执行的sql语句
     * @return 查询的最终结果
     */
    public static LinkedList<LinkedHashMap<String,Object>> query(String sql){
        LinkedList<LinkedHashMap<String,Object>> lp=null;
//        接口继承自AutoCloseable，可以直接放在try后面的括号中，方法在执行完毕后会自动调用close方法，不需要手动关闭
        try( Connection conn= getConn();
//        （3）获取数据库操作对象Statement（执行增删改查）
             Statement ment=conn.createStatement();
//        （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
             ResultSet se= ment.executeQuery(sql);) {

//            为了解决资源关闭后无法再获取数据的情况，在这里需要进行数据转储
//            进行数据转储的常见方式有有两种，第一种：List+Map,第二种：List+JavaBean
//            准备数据存储的容器
            lp=new LinkedList();
//            获取数据表的元数据
            ResultSetMetaData rm=se.getMetaData();
//            获取该表一共有多少列
            int count=rm.getColumnCount();
//            准备一个map集合存储每一行数据
            LinkedHashMap<String,Object> eachRow=null;
//        （5）解析结果集对象ResultSet，进行相关的业务处理；
            while (se.next()){
    //                每一次读取一行数据，使用一个map进行存储
                eachRow=new LinkedHashMap<>();
    //                通过循环遍历的方式，将数据存储在map中
                for (int i = 1; i <=count ; i++) {
    //                    rm.getColumnName(i),取出对应列的列名
    //                    se.getObject 将对应列的值取出作为map的value
                    eachRow.put(rm.getColumnName(i),se.getObject(i));
                }
                lp.add(eachRow);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return lp;
    }

    /**
     * 新增、删除、修改的操作
     * @param sql 要执行的sql语句
     * @return 影响行数
     */
    public static int update(String sql){
        int count=0;
        try (Connection conn=getConn();
             Statement ment=conn.createStatement();){
            count=ment.executeUpdate(sql);

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return count;

    }




}
